/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package suministros.ejb30.DAO;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.sql.DataSource;
import suministros.ejb30.TO.AnoTO;
import suministros.ejb30.TO.ElementoCostoTO;
import suministros.ejb30.TO.MesTO;
import suministros.ejb30.entity.CosteoDiario;
import suministros.ejb30.entity.ElementoCosto;
import suministros.ejb30.entity.Proveedor;
import suministros.ejb30.entity.Suministros;
import suministros.ejb30.entity.TipoCambioDiario;
import suministros.ejb30.helper.Utiles_Convertir;

/**
 *
 * @author Luis_Angel
 */
@Stateless
public class RRHHGestionCostosDAO implements RRHHGestionCostosDAOLocal {


    @PersistenceUnit(unitName="suministros-pu")
     EntityManagerFactory emf;
        @Resource(name = "jdbc/Administracion")
    DataSource dsAdministracion;

    EntityManager em;

     @PostConstruct
      public void inicializaBean()
      {
        this.em = this.emf.createEntityManager();
      }

    @PreDestroy
      public void finalizaBean() {
        this.em.close();
      }
    
    public boolean administrarTipoCambioDiario(TipoCambioDiario cambio) throws Exception {
        boolean retorno=false;
        boolean b = false;
        List<TipoCambioDiario> lista = this.em.createNamedQuery("TipoCambioDiario.findAll").getResultList();
        for (TipoCambioDiario tipoCambioDiario : lista) {
            if(tipoCambioDiario.getFecha().equalsIgnoreCase(cambio.getFecha())){
                tipoCambioDiario.setTipoCambio(cambio.getTipoCambio());
                this.em.merge(b);
                b=true;
                break;
            }
        }
        if(!b)
            this.em.persist(cambio);
        retorno = true;
        return retorno;
    }

    public List<ElementoCosto> getListaElementoCosto() throws Exception {
        return this.em.createNamedQuery("ElementoCosto.findAll").getResultList();
    }

    public List<ElementoCostoTO> getListaElementosCosto() throws Exception {
        Query consulta =this.em.createNativeQuery("SELECT id_elemento_costo, desc_elemento FROM elemento_costo");
        return Utiles_Convertir.convertirToBeanBinding_ElementosCosto(consulta.getResultList());
    }

    public boolean insertaCosteoDiario(CosteoDiario costeo) throws Exception {
        boolean retorno = false;
         EntityTransaction tx = this.em.getTransaction();
        tx.begin();

         try {


             Proveedor p = this.em.find(Proveedor.class, costeo.getCodProveedor().getCodProveedor());
             Suministros sumi = this.em.find(Suministros.class, costeo.getIdSuministro().getIDSuministro());
              costeo.setCodProveedor(p);
              costeo.setIdSuministro(sumi);
              //this.em.persist(costeo);
              this.em.merge(costeo);
              this.em.flush();
              tx.commit();
               retorno=true;
          } catch (Exception e) {
                  tx.rollback();
                  throw e;
            }
        return retorno;
    }

     public boolean eliminaCosteoDiario(int id_costeo) throws Exception {
        boolean retorno = false;
         EntityTransaction tx = this.em.getTransaction();
        tx.begin();

         try {
             CosteoDiario c = this.em.find(CosteoDiario.class, Long.parseLong(String.valueOf(id_costeo)));
             this.em.remove(c);
              this.em.flush();
              tx.commit();
               retorno=true;
          } catch (Exception e) {
                  tx.rollback();
                  throw e;
            }
        return retorno;
    }

     public List<CosteoDiario> getCosteoDiario() throws Exception {
        List<CosteoDiario> elementos = new ArrayList(1);
        Query q = this.em.createNamedQuery("CosteoDiario.findAll");
        elementos = q.getResultList();
        return elementos;
    }

      public List<CosteoDiario> getCosteoDiarioFechas(Date fecha_ini,Date fecha_fin) throws Exception {
        List<CosteoDiario> elementos = new ArrayList(1);
          System.out.println(">"+fecha_ini+">"+fecha_fin);
        Query q =this.em.createQuery("select c from CosteoDiario c where c.fechaOrden >=:fecha1 and c.fechaOrden <= :fecha2 order by c.fechaOrden desc");
        q.setParameter("fecha1",fecha_ini );
        q.setParameter("fecha2",fecha_fin);
        elementos = q.getResultList();
        return elementos;
    }

     public boolean insertaTipoCambioDiario(TipoCambioDiario cambio)throws Exception{

          boolean retorno = false;
         EntityTransaction tx = this.em.getTransaction();
        tx.begin();

          try {
              TipoCambioDiario cambio_persist = this.em.find(TipoCambioDiario.class, cambio.getFecha());
              if(cambio_persist==null)
                    this.em.persist(cambio);
              else{
                  cambio_persist.setTipoCambio(cambio.getTipoCambio());
                  this.em.merge(cambio_persist);
              }

              this.em.flush();
              tx.commit();
              retorno=true;
          } catch (Exception e) {
                  tx.rollback();
                  throw e;
            }
        return retorno;

     }

     public List<TipoCambioDiario> getTipoCambioDiario(String anio, String mes) throws Exception {
        List<TipoCambioDiario> elementos = new ArrayList(1);
        //Query q = this.em.createNamedQuery("TipoCambioDiario.findAll");
        elementos = this.em.createNativeQuery("SELECT fecha, tipo_cambio as tipoCambio FROM tipo_cambio_diario where year(fecha)='"+anio+"' and month(fecha)='"+mes+"' order by convert(datetime,fecha,103) desc").getResultList();

        //elementos = q.getResultList();
        return Utiles_Convertir.convertirTipoCambioDiario(elementos);
    }

    public TipoCambioDiario getTipoCambio(String fecha) throws Exception {
        return this.em.find(TipoCambioDiario.class, fecha);
    }

     public boolean eliminaElementoCosto(String id) throws Exception {
        boolean retorno = false;
        EntityTransaction tx = this.em.getTransaction();
        tx.begin();
        try {
            this.em.remove(this.em.find(ElementoCosto.class, id));
            this.em.flush();
            tx.commit();
            retorno = true;
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
            throw e;
        }
        return retorno;
    }

     public boolean operaElementoCosto(ElementoCosto elemento) throws Exception {
        boolean retorno = false;
        EntityTransaction tx = this.em.getTransaction();
        tx.begin();
        try {
            System.out.println(">"+elemento.getIdElementoCosto());
            if(elemento.getIdElementoCosto()==null){
                elemento.setIdElementoCosto(getIdElementoCosto());
                elemento.setVerReporteCostoDiario(false);
            }
            this.em.merge(elemento);
            this.em.flush();
            tx.commit();
            retorno = true;
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
            throw e;
        }

        return retorno;
    }


     private String getIdElementoCosto() throws Exception {
        String retorno = null;
        Connection cnx = null;
        try {
            //Utiles_Fecha fecha = new Utiles_Fecha(orden.getFechaemision());
            cnx = this.dsAdministracion.getConnection();
            CallableStatement csLlamada = cnx.prepareCall("{? = call [dbo].[f_sumi_getcodigoElementoCosto]()}");
            csLlamada.registerOutParameter(1, 12);
            csLlamada.execute();
            retorno = csLlamada.getString(1);
        } catch (SQLException ex) {
            throw ex;
        } finally {
            try {
                cnx.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return retorno;
    }

       public List<AnoTO> getListaAnosCambio() throws Exception {
        Query consulta = this.em.createNativeQuery("select distinct year(fecha) from tipo_cambio_diario order by 1");
        return Utiles_Convertir.convertirToBeanBinding_Ano(consulta.getResultList());
      }

      public List<MesTO> getListaMesCambio() throws Exception {
        Query consulta = this.em.createNativeQuery("select distinct year(fecha),month(fecha) from tipo_cambio_diario order by 1,2");
        return Utiles_Convertir.convertirToBeanBinding_Mes(consulta.getResultList());
      }


    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
 
}
